【PHP】フィールド - オブジェクトの内部変数
クラスには“フィールド”と呼ぶ変数を定義できます。
フィールドは“プロパティ”や“属性”などとも呼び、オブジェクトに値を持たせることが可能です。
ここでは、フィールドについて解説します。
検証環境
フィールド
フィールドは“オブジェクトに値を持たせる変数”です。
クラスにフィールドを定義することで、生成したオブジェクトはデータ構造にそのフィールドを持ちます。
フィールドは変数のため、値の代入や取得等のアクセスが可能です。
また、フィールドは別名として『プロパティ』や『属性』、『メンバー変数』などと呼ぶ場合があります。
※ 名称によって厳密には意味合いが異なる場合があります。
フィールドの定義
フィールドを使うには定義が必要です。
基本構文
class クラス名 {
アクセス修飾子 $フィールド名;
}
アクセス修飾子 $フィールド名の部分がフィールドの定義です。
複数フィールドを定義する場合は、同じようにクラス定義の波括弧({})内に記述します。
アクセス修飾子
アクセス修飾子はアクセス権限です。
詳しくは別途解説しますが、public、protected、privateの3種類があります。
ここでは、いずれかを指定するということを覚えていただければ問題ありませんが、学習中の方は理解をスムーズに進めるため、“どこからでもアクセス可能”を意味するpublicを使うことをおすすめします。
サンプル
<?php
// 人間クラス
class Person {
// 名前
___ih_hl_start
public $name;
___ih_hl_end
// 身長
___ih_hl_start
public $height;
___ih_hl_end
}
?>
$ php sample.php
5行目と7行目がフィールドの定義です。
人間を表現するPersonクラスに、名前と身長のフィールドとして$nameと$heightを定義しました。
値の取得
フィールドは、通常の変数と同様に値を取得できます。
基本構文
変数->フィールド名
変数はオブジェクトを記憶する変数です。
フィールド名をアロー演算子(->)で繋げて記述します。
サンプル
<?php
// 人間クラス
class Person {
// 名前
public $name;
// 身長
public $height;
}
// オブジェクトの生成
$person = new Person();
// 値の取得
___ih_hl_start
var_dump($person->name);
var_dump($person->height);
___ih_hl_end
?>
$ php sample.php
NULL
NULL
先ず、12行目のnew Person()によってオブジェクトを生成し、$personに代入しています。
クラスの定義に従って、$personに記憶したオブジェクトは、$nameと$heightの2つのフィールドを所有します。
そして、15行目と16行目の$person->nameと$person->heightが値の取得です。
初期値が未設定のため、var_dump関数の出力はNULLになります。
値の記憶
フィールドは、通常の変数と同様に値を記憶できます。
基本構文
変数->フィールド名 = 値
通常の変数と同様に代入演算子を使って値を記憶しますが、左オペランドでフィールドを指定します。
フィールドの指定方法は値の取得と同様でアロー演算子を使います。
サンプル
<?php
// 人間クラス
class Person {
// 名前
public $name;
// 身長
public $height;
}
// オブジェクトの生成
$person = new Person();
// 値の代入
___ih_hl_start
$person->name = 'TANAKA';
$person->height = 175;
___ih_hl_end
// 値の取得
var_dump($person->name);
var_dump($person->height);
?>
$ php sample.php
string(6) "TANAKA"
int(175)
15行目と16行目がフィールドの値の記憶です。
$nameフィールドに'TANAKA'、$heightフィールドに175をそれぞれ記憶しています。
19〜20行目のvar_dump関数を使った出力からも値が記憶できてることが分かります。
オブジェクトの記憶領域
1つのクラスからオブジェクトは複数生成できます。
オブジェクトはそれぞれ別の記憶領域を持つため、フィールドの記憶領域もオブジェクトごとに異なります
そのため、オブジェクトごとに異なる値をフィールドに記憶することが可能です。
<?php
// 人間クラス
class Person {
// 名前
public $name;
// 身長
public $height;
}
// オブジェクト1
$person1 = new Person();
$person1->name = 'TANAKA';
$person1->height = 175;
// オブジェクト2
$person2 = new Person();
$person2->name = 'SUZUKI';
$person2->height = 171;
// 値の確認
echo '[ $person1 ]'."\n";
var_dump($person1->name);
var_dump($person1->height);
echo '[ $person2 ]'."\n";
var_dump($person2->name);
var_dump($person2->height);
?>
$ php sample.php
[ $person1 ]
string(6) "TANAKA"
int(175)
[ $person2 ]
string(6) "SUZUKI"
int(171)
$person1と$person2はPersonクラスのオブジェクトです。
13〜14行目と18〜19行目で各オブジェクトのフィールドに値を代入しており、実行結果からそれぞれが値を正常に記憶できていることが分かります。
演習問題
次の実行結果になる車クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。
- 車クラスを作成する
- 車クラスのフィールドはナンバー、色、乗車人数とする
- 出力は車クラスのインスタンスを使う
===== 車情報 =====
ナンバー : 1234
色 : 紺色
乗車人数 : 5人
===== 車情報 =====
ナンバー : 0987
色 : 赤
乗車人数 : 2人
次の実行結果になる家クラスを扱うプログラムを作成してください。
なお、下記条件を満たすものとします。
- 家クラスを作成する
- 家クラスのフィールドは階数、間取り、完成日とする
- 出力は家クラスのインスタンスを使う
===== 家情報 =====
階数 : 1階
間取り : 3LDK
完成日 : 2022/01/25
===== 家情報 =====
階数 : 3階
間取り : 10LDK
完成日 : 2020/03/24
===== 家情報 =====
階数 : 2階
間取り : 5LDK
完成日 : 2021/08/01